﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SoftHotel.Models;
using System.Data;
using System.Data.Entity;
using PagedList;

namespace SoftHotel.Controllers
{
    public class ReservaHabController : Controller
    {
        /* Manejamos un solo controlador para ambas clases
         * Al generar las vistas se le pasa solo el modelo de ReservaHab
         * pero como contiene a Detalle se puede acceder desde una sola clase
         */

        static ReservaHabDAO reservaDAO = new ReservaHabDAO();
        static List<ReservaHab> busquedares= new List<ReservaHab>();

        ClienteDAO cliDAO = new ClienteDAO();
        AmbienteDAO ambDAO = new AmbienteDAO();

        /*************************************************** RESERVA *************************************************************/
             
        public ActionResult Index()
        {
            return View();
        }

        /* Los botones (submit) envían el value al método del controller con el mismo nombre de la vista 
         * con el [HttpPost] antepuesto
         */
        

        [HttpPost]
        public ActionResult Index(ReservaHab reserva, string button) //recibe la acción del botón de la pagina de inicio
        {
            if (button == "Buscar")
                return RedirectToAction("Buscar", reserva); //Model de Buscar es IEnumerable (*)
   
            return RedirectToAction(button, "ReservaHab");
        }


        //
        // GET: /ReservaHab/Buscar

        public ActionResult Buscar(ReservaHab reserva)
        {
            List<ReservaHab> reservas = new List<ReservaHab>();
            reservas = reservaDAO.Buscar(reserva);
            foreach (var res in reservas)
            {
                reservaDAO.ActulizarEstado(res);
            }
            return View(reservas);
        }

        [HttpPost]
        public ActionResult Buscar(string button, ReservaHab reserva)
        {
            try
            {
                if (button == "Editar")
                {
                    //reservaDAO.Agregar(reserva);
                    //reservaDAO.SaveChanges();
                    return RedirectToAction("Editar", "ReservaHab");
                }
                
                if (button == "Regresar")
                {
                    return RedirectToAction("Index", "ReservaHab");

                }
                return View("Index");
            }
            catch
            {
                return View(reserva);
            }
        }

        //
        // GET: /ReservaHab/BuscarCliente

        [HttpGet]
        public ActionResult BuscarCliente()
        {
            var clientesAux = cliDAO.clientes.Include(a => a.objeTipoDoc).Include(a => a.objEstado).Include(a => a.objTipoCliente);

            clientesAux = clientesAux.OrderByDescending(s => s.apellidoPaterno.ToLower());
            int tamanhoPagina = 5;
            int NumPagina = 1;
            return PartialView("BuscarCliente", clientesAux.ToPagedList(NumPagina, tamanhoPagina));
        }


        //public ActionResult BuscarCliente(PagedList.IPagedList<SoftHotel.Models.Cliente> cliente)
        [HttpPost]
        public ActionResult BuscarCliente(Cliente cliente)
        {
            return Content(cliente.idCliente.ToString());
        }

        [HttpGet]
        public ActionResult _vistaParcial(int id)
        {
            List<DetalleReservaHab> detReserva = new List<DetalleReservaHab>();
            detReserva = reservaDAO.BuscarDetalle(id);
            return PartialView("_detalleIndex", detReserva);
        }

        //
        // GET: /ReservaHab/Details
        [HttpGet]
        public ActionResult Details(ReservaHab reserva)
        {
            reservaDAO.CalcularTotal(reserva);
            reservaDAO.ActulizarEstado(reserva);
            return View(reserva);
        }

        [HttpPost]
        public ActionResult Details(ReservaHab reserva, string button)
        {
            try
            {
                if (button == "Editar")
                {
                    return RedirectToAction("Editar", "ReservaHab", reserva);
                }

                if (button == "Volver")
                {
                    return RedirectToAction("Index", "ReservaHab");

                }
                return View("Index");
            }
            catch
            {
                return View(reserva);
            }
        }
        
//        // GET: /ReservaHab/Agregar

        public ActionResult Agregar()
        {
            ReservaHab reserva = new ReservaHab();
            return View(reserva);
        } 

        //
        // POST: /ReservaHab/Agregar

        [HttpPost]
        public ActionResult Agregar(ReservaHab reserva, string button)
        {
            try
            {
                if (button == "Añadir")
                {
                    reservaDAO.Agregar(reserva);

                    DetallePromocionDAO promoDAO = new DetallePromocionDAO();
                    promoDAO.generar_promo(reserva.idCliente, reserva.idReserva);

                    DetalleReservaHab detalle = new DetalleReservaHab();
                    detalle.idReserva = reserva.idReserva;
                    return RedirectToAction("AgregarDetalle", "ReservaHab", detalle);
                } 
                return View("Index");
            }
            catch
            {
                return View(reserva);
            }
        }

        // GET: /ReservaHab/Editar

        [HttpGet]
        public ActionResult Editar(ReservaHab reserva)
        {
            reservaDAO.CalcularTotal(reserva);
            reservaDAO.ActulizarEstado(reserva);
            return View(reserva);
        }

            
        //POST: /ReservaHab/Editar

        [HttpPost]
        public ActionResult Editar(string button, ReservaHab reserva)
        {
            //try
            //{
                if (button == "Checkin")
                {
                    reservaDAO.Checkin(reserva);
                    return View(reserva);
                }
                if (button == "Checkout")
                {
                    reservaDAO.Checkout(reserva);
                    return View(reserva);
                }
                return View("Index");
            //}
            //catch
            //{
            //    return View(reserva);
            //}
            

        }

        /******************************************** DETALLE RESERVA *************************************************************/


        // GET: /ReservaHab/AgregarDetalle

        public ActionResult AgregarDetalle(DetalleReservaHab detalle)
        {
            //DetalleReservaHab detalle = new DetalleReservaHab(reserva.idReserva);
            return View(detalle);
        }

        //
        // POST: /ReservaHab/AgregarDetalle

        [HttpPost]
        public ActionResult AgregarDetalle(DetalleReservaHab detalle, string button)
        {
            //try
            //{
                if (button == "Guardar")
                {
                    reservaDAO.AgregarDetalle(detalle);
                    ReservaHab reserva = new ReservaHab();
                    reserva = reservaDAO.Buscar(detalle.idReserva);
                    return RedirectToAction("Editar", "ReservaHab", reserva);
                }
                return View("Index");
            //}
            //catch
            //{
            //    return View(detalle);
            //}
        }

        [HttpGet]
        public ActionResult BuscarAmbiente()
        {
            List<Ambiente> ambientesAux = ambDAO.obtenerHabitacionesDisponibles();

            int tamanhoPagina = 5;
            int NumPagina = 1;
            return PartialView("BuscarAmbiente", ambientesAux.ToPagedList(NumPagina, tamanhoPagina));
        }


        //public ActionResult BuscarAmbiente
        [HttpPost]
        public ActionResult BuscarAmbiente(Ambiente ambiente)
        {
            return Content(ambiente.idAmbiente.ToString());
        }

        //
        // GET: /DetalleReservaEv/Edit/5

        public ActionResult EditarDetalle(int id)
        {
            DetalleReservaHab detalle = new DetalleReservaHab();
            detalle = reservaDAO.BuscarDetalleID(id);

            return View(detalle);
        }

        //
        // POST: /DetalleReservaEv/Edit/5

        [HttpPost]
        public ActionResult EditarDetalle(DetalleReservaHab detalle)
        {
            
            // TODO: Add update logic here
            reservaDAO.EditarDetalle(detalle);

            return RedirectToAction("Editar", "ReservaHab", detalle);
            
        }

        [HttpGet]
        public ActionResult _verDetalle(int id)
        {
            List<DetalleReservaHab> detReserva = new List<DetalleReservaHab>();
            detReserva = reservaDAO.BuscarDetalle(id);
            return PartialView("_verDetalle", detReserva);
        }
    }
}
